/**
 * 表单提交的数据校验装饰器
 * 一个高阶函数
 */
import { GlobalErrorTypes } from "../error";
import { Controller } from "egg";

/**
 * 验证装饰器
 * _prototype：被装饰函数的原型
 * _key：被装饰函数的名称
 * descriptor：方法的属性描述符（说人话：就是被描述的对象本身）
 * @param {any} rules 验证规则
 * @param {GlobalErrorTypes} errorType 错误信息
 */
export default function validateInput(rules: any, errorType: GlobalErrorTypes) {
  return function (_prototype, _key: string, descriptor: PropertyDescriptor) {
    const originMethod = descriptor.value;
    descriptor.value = async function (...args: any[]) {
      const that = this as Controller;
      // eslint-disable-next-line @typescript-eslint/ban-ts-comment
      // @ts-ignore
      const { ctx, app } = that;
      const errors = app.validator.validate(rules, ctx.request.body);
      if (errors) {
        return ctx.helper.error({ ctx, errorType, error: errors });
      }
      await originMethod.apply(this, args);
    };
  };
}
